#include <stdio.h>
#include <stdlib.h>

#define CHUNK_SIZE 2048  // 定义每个包的大小

void split_bin_file(const char *input_file, const char *output_prefix) {
    FILE *fp = fopen("F:/UTV_ZXCTRL1.bin", "rb");
    if (!fp) {
        perror("无法打开输入文件");
        exit(EXIT_FAILURE);
    }

    // 获取文件大小
    fseek(fp, 0, SEEK_END);
    long file_size = ftell(fp);
    fseek(fp, 0, SEEK_SET);

    // 计算分包数量
    int num_chunks = (file_size + CHUNK_SIZE - 1) / CHUNK_SIZE;
    printf("文件大小: %ld 字节, 分包数量: %d\n", file_size, num_chunks);

    // 分配内存读取文件
    unsigned char *buffer = (unsigned char *)malloc(CHUNK_SIZE);
    if (!buffer) {
        perror("内存分配失败");
        fclose(fp);
        exit(EXIT_FAILURE);
    }

    // 逐包读取和保存
    for (int i = 0; i < num_chunks; ++i) {
        // 创建输出文件名
        char output_file[256];
        snprintf(output_file, sizeof(output_file), "%s_part_%d.bin", output_prefix, i);

        // 读取一包数据
        size_t bytes_read = fread(buffer, 1, CHUNK_SIZE, fp);

        // 打开输出文件保存该包
        FILE *out_fp = fopen(output_file, "wb");
        if (!out_fp) {
            perror("无法打开输出文件");
            free(buffer);
            fclose(fp);
            exit(EXIT_FAILURE);
        }

        // 写入数据到输出文件
        fwrite(buffer, 1, bytes_read, out_fp);
        fclose(out_fp);

        printf("已保存包 %d 到 %s (%zu 字节)\n", i, output_file, bytes_read);
    }

    // 清理
    free(buffer);
    fclose(fp);
    printf("分包完成。\n");
}

int main() {
    const char *input_file = "F:/open/stm32cubmx/keil_V5/FreeRtos/IAP/IAP_CAN_1/project/IAR_V9.3/Debug/分包/UTV_ZXCTRL1.bin";  // 在代码中定义输入文件路径
    const char *output_prefix = "test";  // 在代码中定义输出文件前缀

    split_bin_file(input_file, output_prefix);


    system("pause");
    return EXIT_SUCCESS;
}
